#ifndef __VALIDATOR_H__
#define __VALIDATOR_H__

#include "GAmodSettings.hpp"
#include "popolazione.hpp"
#include "common.hpp"

/** \class ValidatorException
 *  \brief Eccezioni lanciate dalla classe Validator
 */
class ValidatorException : public EHW_Exception
{
    public:
    ValidatorException(char *mess) : EHW_Exception(mess) {};
};


/** \class  Validator
 *  \brief  Modulo del framework responsabile del calcolo del fitness dei singoli individui.
 */
class Validator {

    public:
    //! Specifica quali statistiche devono essere calcolate nella fase di valutazione
    enum stat_generation{
        STAT_ALL    =0xFF,  //!< Tutte le statistiche
        STAT_BEST   =0X01,  //!< Calcolo del migliore individuo
        STAT_NONE   =0      //!< Nessuna statistica
        };

    /** Funzione da implementare per eseguire la valutazione di tutta la popolazione (e pre-calcolo delle statistiche)
     *
     *  \param[in]  pop Popolazione da valutare
     *  \param[in]  sg  Specifica di quali statistiche vanno calcolate durante la valutazione
     */
    virtual unsigned int valuta_pop(Popolazione *pop,stat_generation sg=Validator::STAT_ALL) throw(ValidatorException) = 0;

    /** Ritorna le statistiche di valutazione
     *
     *  \param[out] settings    Lista di statistiche
     */
    virtual int getValutatorStats(GAmodSettings &settings) throw(ValidatorException) =0;

    /** Restituisce il massimo valore della funzione di fitness
     *
     */
    virtual unsigned int getMaxScore() = 0;

	/** Crea una rappresentazione del comportmento dell'individuo specificato.
	 *
	 *	\param[in]	Ind		Individuo da analizzare
	 *	\param[in]	path	Path del file sul quale verra' riportata la rappresentazione del comportamento dell'individuo
	 */
	virtual unsigned int snapIndividuo(Individuo &Ind,char *path) throw(ValidatorException) =0;

    virtual ~Validator() {};
};

#endif
